/*
 * MyListRendererJLabel.java
 *
 * Copyright 2011 Universidad Francisco de Paula Santander (UFPS).
 * Todos los Derechos Reservados.
 * Creado el 07/03/2011, 11:23:38 AM
 */

package com.ufps.cuatro.util.render;

import java.awt.Color;
import java.awt.Component;
import java.io.Serializable;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

import javax.swing.ImageIcon;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.ListCellRenderer;

import com.ufps.cuatro.modelo.analizador.ObjetoReflexion;
import com.ufps.cuatro.modelo.biblioteca.ItemStaticListModelObject;
import com.ufps.cuatro.modelo.biblioteca.StaticListModelObject;
import com.ufps.cuatro.modelo.representacion.ModeloAsociado;
import com.ufps.cuatro.modelo.representacion.ObjetoTipoDatoReflexion;
import com.ufps.cuatro.modelo.representacion.Oyente;
import com.ufps.cuatro.modelo.representacion.PlantillaCombo;
import com.ufps.cuatro.modelo.representacion.PropiedadBeans;
import com.ufps.cuatro.modelo.representacion.componente.Componente;
import com.ufps.cuatro.modelo.old.ComponenteBeans;
import com.ufps.cuatro.modelo.representacion.componente.ComponenteDistribuidorContenedorEspejo;
import com.ufps.cuatro.modelo.representacion.componente.ComponenteDistribuidorContenedorLibre;
import com.ufps.cuatro.modelo.representacion.componente.ComponenteDistribuidorExtra;
import com.ufps.cuatro.modelo.representacion.componente.ComponenteDistribuidorGeneradorClaseCompleja;
import com.ufps.cuatro.modelo.representacion.componente.ComponenteDistribuidorGeneradorEnum;
import com.ufps.cuatro.modelo.representacion.componente.ComponenteDistribuidorGeneradorMetodo;
import com.ufps.cuatro.modelo.representacion.componente.ComponenteDistribuidorGeneradorString;
import com.ufps.cuatro.modelo.representacion.componente.ComponenteDistribuidorGeneradorUnitario;
import com.ufps.cuatro.modelo.representacion.componente.ComponenteDistribuidorGeneradorVinculador;
import com.ufps.cuatro.modelo.representacion.componente.ComponenteDistribuidorIntegradorExtra;
import com.ufps.cuatro.modelo.representacion.componente.ComponenteDistribuidorIntegradorMetodo;
import com.ufps.cuatro.modelo.representacion.componente.ComponenteDistribuidorIntegradorSimple;
import com.ufps.cuatro.modelo.representacion.componente.ComponenteGeneradoInterno;
import com.ufps.cuatro.modelo.representacion.componente.ComponenteGeneradoSimple;
import com.ufps.cuatro.util.ItemViewContenedor;
import com.ufps.cuatro.util.MsgInfo;
import com.ufps.cuatro.util.Representacion;
import com.ufps.cuatro.util.TipoCaso;
import com.ufps.cuatro.util.TipoItemViewContenedor;
import com.ufps.cuatro.util.Utileria;
import com.ufps.cuatro.util.model.MyCheckItemComponente;
import com.ufps.cuatro.util.model.MyCheckItemPropertiesClass;

/**
 * <i><b>MyListRendererJLabel:</b></i>@DefinicionClase
 * @author Carlos A. Torres C. - Dolly E. Guerrero. <https://code.google.com/p/tesis4dor/>
 * @version 1.0 07/03/2011
 * @see JLabel
 * @see ListCellRenderer
 * @see Serializable
 */
public class MyListRendererJLabel extends JLabel implements ListCellRenderer, Serializable{

    
    private static final long serialVersionUID = -3557103148835512323L;

    private int modo;    

    /**
     * @DefinicionMetodo
     * @param modo @DefinicionParametro
     */
    public MyListRendererJLabel(int modo) {
        this.modo = modo;        
    }
    
    private void setSinIcono(String info, boolean seleccionado){        
        this.setText(info);
        if(seleccionado){
            this.setOpaque(true);
            this.setForeground(new Color(255,255,255));
            this.setBackground(new Color(33,66,99));
        }
        else{
            this.setForeground(new Color(0,0,0));
            this.setOpaque(false);
        }
    }

    private void setIcono(String key, String info, boolean seleccionado){
        ImageIcon icono = Utileria.leerRecursoImagen(key, 16);
        JLabel labelIcono = new JLabel(icono);
        this.setIcon(labelIcono.getIcon());
        this.setText(info);
        if(seleccionado){
            this.setOpaque(true);
            this.setForeground(new Color(255,255,255));
            this.setBackground(new Color(33,66,99));
        }
        else{
            this.setForeground(new Color(0,0,0));
            this.setOpaque(false);
        }
    }
    
    private void setIcono(String key, String info, boolean seleccionado, boolean negrita){
        ImageIcon icono = Utileria.leerRecursoImagen(key, 16);
        JLabel labelIcono = new JLabel(icono);
        this.setIcon(labelIcono.getIcon());
        this.setText(!negrita ? info : "<html><b>" + info + "</b></html>");                    
        if(seleccionado){
            this.setOpaque(true);
            this.setForeground(new Color(255,255,255));
            this.setBackground(new Color(33,66,99));
        }
        else{
            this.setForeground(new Color(0,0,0));
            this.setOpaque(false);
        }
    }


    public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
       try{
        if(value instanceof ObjetoTipoDatoReflexion){
            ObjetoTipoDatoReflexion obj = (ObjetoTipoDatoReflexion) value;
            this.renderTipoDatoReflexion(obj, isSelected);
        }
        else if(value instanceof ObjetoReflexion){
            ObjetoReflexion objReflexion = (ObjetoReflexion) value;
            this.renderObjetoReflexion(objReflexion, isSelected);
        }
        else if(value instanceof Oyente){
            Oyente objOyente = (Oyente) value;
            this.renderOyente(objOyente, isSelected);
        }
        else if(value instanceof PlantillaCombo){
            PlantillaCombo objPlantillaCombo = (PlantillaCombo) value;
            this.renderPlantillaCombo(objPlantillaCombo, isSelected);
        }        
        else if(value instanceof Componente){            
            Componente objComponente = (Componente) value;
            this.renderComponente(objComponente, isSelected);
        }
        else if(value instanceof String){
            String str = String.valueOf(value);
            if(str.startsWith("Generar")){
                this.setIcono(Utileria.ICONO_OK, (String) value, isSelected);
            }
            else{
                this.setIcono(Utileria.ICONO_VACIO, (String) value, isSelected);
            }
        }
        else if(value instanceof MsgInfo){
            MsgInfo objMSG = (MsgInfo) value;
            switch(objMSG.getTipo()){
                case MsgInfo.ERROR:
                    this.setIcono(Utileria.ICONO_ERROR, objMSG.toString(), isSelected, !objMSG.isVisualizado() ? true : false);
                    break;
                case MsgInfo.INFORMATION:
                    this.setIcono(Utileria.ICONO_INFORMACION, objMSG.toString(), isSelected, !objMSG.isVisualizado() ? true : false);
                    break;
                case MsgInfo.TOOLTIPS:
                    this.setIcono(Utileria.ICONO_TOOL_TIPS, objMSG.toString(), isSelected, !objMSG.isVisualizado() ? true : false);
                    break;
                case MsgInfo.WARNING:
                    this.setIcono(Utileria.ICONO_ADVERTENCIA, objMSG.toString(), isSelected, !objMSG.isVisualizado() ? true : false);
                    break;
                default:
                    this.setIcono(Utileria.ICONO_TOOL_TIPS, objMSG.toString(), isSelected, !objMSG.isVisualizado() ? true : false);
            }            
        }
        else if(value instanceof TipoCaso){
            TipoCaso objTemp = (TipoCaso) value;
            if(objTemp == TipoCaso.eArray){
                this.setIcono(Utileria.ICONO_ARRAY, objTemp.toString(), isSelected);
            }
            else if(objTemp == TipoCaso.ePrimitivo){
                this.setIcono(Utileria.ICONO_PRIMITIVO, objTemp.toString(), isSelected);
            }
            else if(objTemp == TipoCaso.eClaseMundo){
                this.setIcono(Utileria.ICONO_CLASE, objTemp.toString(), isSelected);
            }
            else if(objTemp == TipoCaso.eEnumeracion){
                this.setIcono(Utileria.ICONO_ENUMERACION, objTemp.toString(), isSelected);
            }            
            else if(objTemp == TipoCaso.eJDKNoRegistrado){
                this.setIcono(Utileria.ICONO_JDK_NO_REGISTRADO, objTemp.toString(), isSelected);
            }
            else if(objTemp == TipoCaso.eJDKRegistrado){
                this.setIcono(Utileria.ICONO_JDK_REGISTRADO, objTemp.toString(), isSelected);
            }
            else {
                this.setIcono(Utileria.ICONO_VACIO, "Sin Agregar", isSelected);
            }
        }
        else if(value instanceof ItemViewContenedor){
            ItemViewContenedor objTemp = (ItemViewContenedor) value;
            if(objTemp.geteTipoItem() == TipoItemViewContenedor.eBibliotecaGlobal){
                this.setIcono(Utileria.ICONO_ITEM_COMBO_LIBG, objTemp.toString(), isSelected);
            }
            else if(objTemp.geteTipoItem() == TipoItemViewContenedor.eBibliotecaLocal)
            {
                this.setIcono(Utileria.ICONO_ITEM_COMBO_LIBG, objTemp.toString(), isSelected);
            }
            else if(objTemp.geteTipoItem() == TipoItemViewContenedor.eBibliotecaSwap)
            {
                this.setIcono(Utileria.ICONO_ITEM_COMBO_LIBG, objTemp.toString(), isSelected);
            }        
            else if(objTemp.geteTipoItem() == TipoItemViewContenedor.eAsistenteLibre)
            {
                this.setIcono(Utileria.ICONO_INTERFAZ, objTemp.toString(), isSelected);
            }
            else if(objTemp.geteTipoItem() == TipoItemViewContenedor.eAsistenteEspejo)
            {
                this.setIcono(Utileria.ICONO_INTERFAZ, objTemp.toString(), isSelected);
            }
            else if(objTemp.geteTipoItem() == TipoItemViewContenedor.ePatronEntrada ||
                    objTemp.geteTipoItem() == TipoItemViewContenedor.ePatronSalida ||
                    objTemp.geteTipoItem() == TipoItemViewContenedor.ePatronEntradaSalida)
            {
                this.setIcono(Utileria.ICONO_ITEM_PATRON, objTemp.toString(), isSelected);
            }
            else if(objTemp.geteTipoItem() == TipoItemViewContenedor.eSinSeleccion)
            {
                this.setIcono(Utileria.ICONO_VACIO, objTemp.toString(), isSelected);
            }
            else if(objTemp.geteTipoItem() == TipoItemViewContenedor.eGeneracionComponentesRecomendados){
                this.setIcono(Utileria.ICONO_VACIO, objTemp.toString(), isSelected);
            }
            else if(objTemp.geteTipoItem() == TipoItemViewContenedor.eGeneracionComponentesBasicos){
                this.setIcono(Utileria.ICONO_VACIO, objTemp.toString(), isSelected);
            }
            else if(objTemp.geteTipoItem() == TipoItemViewContenedor.eGeneracionComponentesPersonalizados){
                this.setIcono(Utileria.ICONO_VACIO, objTemp.toString(), isSelected);
            }
        }
//        else if(value instanceof ItemPatron){
//            ItemPatron objItempPatron = (ItemPatron) value;
//            this.setIcono(Utileria.ICONO_ITEM_PATRON, objItempPatron.toString(), isSelected);
//        }
//        else if(value instanceof ObjRepField){
//            ObjRepField objPropiedad = (ObjRepField) value;
//            this.setIcono(Utileria.ICONO_ITEM_PATRON, objPropiedad.toString(), isSelected);
//        }
//        else if(value instanceof ObjRepMethod){
//            ObjRepMethod objPropiedad = (ObjRepMethod) value;
//            this.setIcono(Utileria.ICONO_ITEM_PATRON, objPropiedad.toString(), isSelected);
//        }
        else if(value instanceof MyCheckItemPropertiesClass){
            MyCheckItemPropertiesClass objItem = (MyCheckItemPropertiesClass) value;
            if(objItem.getObjField() != null){
                this.setIcono(Utileria.ICONO_ATRIBUTO, objItem.getObjField().getName(), isSelected);
            }
            else if(objItem.getObjMethod() != null){
                this.setIcono(Utileria.ICONO_METODO, objItem.getObjMethod().getName(), isSelected);
            }           
        }
        else if(value instanceof MyCheckItemComponente){
            MyCheckItemComponente objItem = (MyCheckItemComponente) value;
            this.renderComponente((Componente) objItem.getObjComponente(), isSelected);         
        }
        else if(value instanceof ModeloAsociado){
            ModeloAsociado objItem = (ModeloAsociado) value;
            this.setIcono(Utileria.ICONO_MODELO_ASOCIADO, objItem.getStrName(), isSelected);         
        }
        else if(value instanceof ComponenteBeans){
            ComponenteBeans objItem = (ComponenteBeans) value;
            this.setIcono(Utileria.ICONO_COMPONENTE_BEANS, objItem.getName(), isSelected);         
        }
        else if(value instanceof PropiedadBeans){
            PropiedadBeans objItem = (PropiedadBeans) value;
            this.setIcono(Utileria.ICONO_COMPONENTE, objItem.toString(), isSelected);         
        }
        else if(value instanceof StaticListModelObject){
            StaticListModelObject objItem = (StaticListModelObject) value;
            this.setIcono(Utileria.ICONO_MODEL_STATIC, objItem.toString(), isSelected);         
        }
        else if(value instanceof ItemStaticListModelObject){
            ItemStaticListModelObject objItem = (ItemStaticListModelObject) value;
            this.setIcono(Utileria.ICONO_ITEM_MODEL_STATIC, objItem.toString(), isSelected);         
        }
        else{
            if(value != null){
                setSinIcono(value.toString(), isSelected);
            }
        }
        return this;
    }catch(java.lang.NullPointerException ex){}
       return null;
    }
    
    private void renderTipoDatoReflexion(ObjetoTipoDatoReflexion obj, boolean isSelected){                
        Class objTemp = obj.getObjClass();
        if(objTemp.isPrimitive()){
            this.setIcono(Utileria.ICONO_PRIMITIVO, obj.getStrNombre(), isSelected);
        }
        else if(objTemp.isArray()){
            this.setIcono(Utileria.ICONO_ARRAY, obj.getStrNombre(), isSelected);
        }
        else if(objTemp.isAnnotation()){
            this.setIcono(Utileria.ICONO_ANOTACION, obj.getStrNombre(), isSelected);
        }
        else if(objTemp.isEnum()){
            this.setIcono(Utileria.ICONO_ENUMERACION, obj.getStrNombre(), isSelected);
        }
        else if(objTemp.isInterface()){
            this.setIcono(Utileria.ICONO_INTERFAZ, obj.getStrNombre(), isSelected);
        }
        else if(Representacion.esCasoRegistrado(objTemp)){
            this.setIcono(Utileria.ICONO_JDK_REGISTRADO, obj.getStrNombre(), isSelected);
        }
        else if(Representacion.esCasoClaseMundo(objTemp.getCanonicalName())){
            this.setIcono(Utileria.ICONO_CLASE, obj.getStrNombre(), isSelected);
        }
        else {
            this.setIcono(Utileria.ICONO_JDK_NO_REGISTRADO, obj.getStrNombre(), isSelected);
        }
    }
    
    private void renderObjetoReflexion(ObjetoReflexion objReflexion, boolean isSelected){
        if(objReflexion.getObj() instanceof Field){
            Field objField = (Field) objReflexion.getObj();
            this.setIcono(Utileria.ICONO_ATRIBUTO, objField.getName(), isSelected);
        }
        else if(objReflexion.getObj() instanceof Method){
            Method objMethod = (Method) objReflexion.getObj();
            this.setIcono(Utileria.ICONO_METODO, objMethod.getName(), isSelected);
        }
        else if(objReflexion.getObj() instanceof Constructor){
            Constructor objConstructor = (Constructor) objReflexion.getObj();
            this.setIcono(Utileria.ICONO_CONSTRUCTOR, objConstructor.toGenericString(), isSelected);
        }
        else {
            Class<?> objClass = objReflexion.getObjClass();                    
            if(!objClass.getSimpleName().equals(objReflexion.getStrNombre())){
                this.setIcono(Utileria.ICONO_ATRIBUTO, objReflexion.getStrNombre() + " : " + objClass.getCanonicalName(), isSelected);
            }
            else{
                this.setIcono(Utileria.ICONO_CLASE, objClass.getName(), isSelected);
            }
        }
    }
    
    private void renderOyente(Oyente objOyente, boolean isSelected){
        this.setIcono(Utileria.ICONO_OYENTE, objOyente.getStrNombre(), isSelected);
    }
    
    private void renderPlantillaCombo(PlantillaCombo objPlantillaCombo, boolean isSelected){
        this.setIcono(Utileria.ICONO_PLANTILLA, objPlantillaCombo.toString(), isSelected);
    }
    
    private void renderComponente(Componente value, boolean isSelected){        
        if(value instanceof ComponenteDistribuidorGeneradorClaseCompleja){
            ComponenteDistribuidorGeneradorClaseCompleja objComponente = (ComponenteDistribuidorGeneradorClaseCompleja) value;
            String strEditado = objComponente.isFinish() ? "" : " [E]";
            this.setIcono(Utileria.ICONO_COMPONENTE_CLASE_COMPLEJA, objComponente.getName() + strEditado, isSelected);                
        }
        else if(value instanceof ComponenteDistribuidorGeneradorMetodo){
            ComponenteDistribuidorGeneradorMetodo objComponente = (ComponenteDistribuidorGeneradorMetodo) value;
            String strEditado = objComponente.isFinish() ? "" : " [E]";
            this.setIcono(Utileria.ICONO_COMPONENTE_METODO, objComponente.getName() + strEditado, isSelected);                
        }
        else if(value instanceof ComponenteDistribuidorGeneradorEnum){
            ComponenteDistribuidorGeneradorEnum objComponente = (ComponenteDistribuidorGeneradorEnum) value;
            String strEditado = objComponente.isFinish() ? "" : " [E]";
            this.setIcono(Utileria.ICONO_COMPONENTE_ENUM, objComponente.getName() + strEditado, isSelected);                
        } 
        else if(value instanceof ComponenteDistribuidorGeneradorVinculador){
            ComponenteDistribuidorGeneradorVinculador objComponente = (ComponenteDistribuidorGeneradorVinculador) value;
            String strEditado = objComponente.isFinish() ? "" : " [E]";
            this.setIcono(Utileria.ICONO_COMPONENTE_GENERADOR_VINCULADOR, objComponente.getName() + strEditado, isSelected);                
        }
        else if(value instanceof ComponenteDistribuidorGeneradorUnitario){
            ComponenteDistribuidorGeneradorUnitario objComponente = (ComponenteDistribuidorGeneradorUnitario) value;
            String strEditado = objComponente.isFinish() ? "" : " [E]";
            this.setIcono(Utileria.ICONO_COMPONENTE_GENERADOR_UNITARIO, objComponente.getName() + strEditado, isSelected);
        }        
        else if(value instanceof ComponenteDistribuidorGeneradorString){
            ComponenteDistribuidorGeneradorString objComponente = (ComponenteDistribuidorGeneradorString) value;
            String strEditado = objComponente.isFinish() ? "" : " [E]";
            this.setIcono(Utileria.ICONO_COMPONENTE_GENERADOR_STRING, objComponente.getName() + strEditado, isSelected);
        }
        else if(value instanceof ComponenteDistribuidorIntegradorMetodo){
            ComponenteDistribuidorIntegradorMetodo objComponente = (ComponenteDistribuidorIntegradorMetodo) value;
            String strEditado = objComponente.isFinish() ? "" : " [E]";
            this.setIcono(Utileria.ICONO_COMPONENTE_INTEGRADOR_METODO, objComponente.getName() + strEditado, isSelected);
        }
        else if(value instanceof ComponenteDistribuidorIntegradorSimple){
            ComponenteDistribuidorIntegradorSimple objComponente = (ComponenteDistribuidorIntegradorSimple) value;
            String strEditado = objComponente.isFinish() ? "" : " [E]";
            this.setIcono(Utileria.ICONO_COMPONENTE_INTEGRADOR_SIMPLE, objComponente.getName() + strEditado, isSelected);
        }
        else if(value instanceof ComponenteDistribuidorIntegradorExtra){
            ComponenteDistribuidorIntegradorExtra objComponente = (ComponenteDistribuidorIntegradorExtra) value;
            String strEditado = objComponente.isFinish() ? "" : " [E]";
            this.setIcono(Utileria.ICONO_COMPONENTE_INTEGRADOR_EXTRA, objComponente.getName() + strEditado, isSelected);
        }
        else if(value instanceof ComponenteDistribuidorContenedorLibre){
            ComponenteDistribuidorContenedorLibre objComponente = (ComponenteDistribuidorContenedorLibre) value;
            String strEditado = objComponente.isFinish() ? "" : " [E]";
            this.setIcono(Utileria.ICONO_COMPONENTE_CONTENEDOR_ASISTENTE_LIBRE, objComponente.getName() + strEditado, isSelected);
        }
        else if(value instanceof ComponenteDistribuidorContenedorEspejo){
            ComponenteDistribuidorContenedorEspejo objComponente = (ComponenteDistribuidorContenedorEspejo) value;
            String strEditado = objComponente.isFinish() ? "" : " [E]";
            this.setIcono(Utileria.ICONO_COMPONENTE_CONTENEDOR_ASISTENTE_ESPEJO, objComponente.getName() + strEditado, isSelected);
        }
        else if(value instanceof ComponenteGeneradoSimple){
            ComponenteGeneradoSimple objComponente = (ComponenteGeneradoSimple) value;
            String strEditado = objComponente.isFinish() ? "" : " [E]";
            this.setIcono(Utileria.ICONO_COMPONENTE_GENERADO, objComponente.getName() + strEditado, isSelected);
        }
        else if(value instanceof ComponenteGeneradoInterno){
            ComponenteGeneradoInterno objComponente = (ComponenteGeneradoInterno) value;
            String strEditado = objComponente.isFinish() ? "" : " [E]";
            this.setIcono(Utileria.ICONO_COMPONENTE_GENERADOR, objComponente.getName() + strEditado, isSelected);
        }
        else if(value instanceof ComponenteDistribuidorExtra){
            ComponenteDistribuidorExtra objComponente = (ComponenteDistribuidorExtra) value;
            String strEditado = objComponente.isFinish() ? "" : " [E]";
            this.setIcono(Utileria.ICONO_COMPONENTE_EXTRA, objComponente.getName() + strEditado, isSelected);
        }
    }



}
